package day9;
//synchronized方法 和 静态方法
public class TestSyn {
    //普通方法public void printA(){}
    //同步方法:同一个对象 同步方法 都是同一把锁(当前对象this)
    public synchronized void printA(){
        String name=Thread.currentThread().getName();
        System.out.println(name+"开始A");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name+"结束A");
    }
    //同步方法
    public synchronized void printB(){
        String name=Thread.currentThread().getName();
        System.out.println(name+"开始B");
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name+"结束B");
    }
    //静态同步方法:锁的不是this 是当前对象的类对象(TestSyn.class)
    public synchronized static void printC(){
        String name=Thread.currentThread().getName();
        System.out.println(name+"开始C");
        try {
            Thread.sleep(700);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name+"结束C");
    }
    public synchronized static void printD(){
        String name=Thread.currentThread().getName();
        System.out.println(name+"开始D");
        try {
            Thread.sleep(800);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name+"结束D");
    }
    public static void main(String[] args) {
        TestSyn ts=new TestSyn();
        Demo demo=new Demo();
        TestSyn ts1=new TestSyn();
        //A和B线程两者调用的都是同步方法 锁的是当前的this
        //它们属于同一把锁 所以A方法没有执行结束 B方法需要等待执行
        //C和D线程两者调用静态同步方法 锁的是类对象TestSyn.class
        //它们也属于同一把锁 所以C方法没有执行完 D需要等待执行
        new Thread(()->{
            ts.printA();//this--->ts
        },"AAA").start();
        new Thread(()->{
            ts.printB();//this--->ts
        },"BBB").start();
        new Thread(()->{
            ts.printC();//类对象--->
        },"CCC").start();
        new Thread(()->{
            ts.printD();
        },"DDD").start();
    }
}
class Demo{
    public synchronized void printB(){
        String name=Thread.currentThread().getName();
        System.out.println(name+"开始B");
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name+"结束B");
    }
}
